package proyecto.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import javax.sql.DataSource;
import proyecto.excepcion.DAOExcepcion;
import proyecto.modelo.Medico;


public class MedicoDAOImpl extends BaseDAO implements MedicoDAO {

    private DataSource dataSource;

    public DataSource getDataSource() {
        return dataSource;
    }

    public void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
    }


   public Collection<Medico> buscarPorDni(String dni)
            throws DAOExcepcion {
        String query = "select codigoMedico, Especialidad_codigoEspecialidad, dni, nombres, apellidos, numColegiatura, sexo, fechaNac, direccion, telefono, mail from medico where dni like ?";
        Collection<Medico> lista = new ArrayList<Medico>();
        Connection con = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            con = dataSource.getConnection();
            stmt = con.prepareStatement(query);
            stmt.setString(1, "%" + dni + "%");
            rs = stmt.executeQuery();
            while (rs.next()) {
                Medico vo = new Medico();
                vo.setCodigoMedico(rs.getInt("codigoPaciente"));
                vo.setCodigoMedico(rs.getInt("Especialidad_codigoEspecialidad"));
                vo.setDni(rs.getString("dni"));
                vo.setNombres(rs.getString("nombres"));
                vo.setApellidos(rs.getString("apellidos"));
                vo.setNumColegiatura(rs.getInt("numColegiatura"));
                vo.setSexo(rs.getString("sexo"));
                vo.setFechaNac(rs.getString("fechaNac"));
                vo.setDireccion(rs.getString("direccion"));
                vo.setTelefono(rs.getString("telefono"));
                vo.setMail(rs.getString("mail"));
                lista.add(vo);
            }
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarResultSet(rs);
            this.cerrarStatement(stmt);
            this.cerrarConexion(con);
        }
        System.out.println(lista.size());
        return lista;
    }

    public Medico insertar(Medico vo) throws DAOExcepcion {
        String query = "INSERT INTO medico(Especialidad_codigoEspecialidad, dni, nombres, apellidos, numColegiatura, sexo, fechaNac, direccion, telefono, mail) VALUES (?,?,?,?,?,?,?,?,?,?)";
        Connection con = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            con = dataSource.getConnection();
            stmt = con.prepareStatement(query);
            stmt.setInt(1, vo.getEspecialidadcodigoEspecialidad());
            stmt.setString(2, vo.getDni());
            stmt.setString(3, vo.getNombres());
            stmt.setString(4, vo.getApellidos());
            stmt.setInt(5, vo.getNumColegiatura());
            stmt.setString(6, vo.getSexo());
            stmt.setString(7, vo.getFechaNac());
            stmt.setString(8, vo.getDireccion());
            stmt.setString(9, vo.getTelefono());
            stmt.setString(10, vo.getMail());
            int i = stmt.executeUpdate();
            if (i != 1) {
                throw new SQLException("No se pudo insertar");
            }
            // Obtener el ultimo id
            int id = 0;
            query = "SELECT LAST_INSERT_ID()";
            stmt = con.prepareStatement(query);
            rs = stmt.executeQuery();
            if (rs.next()) {
                id = rs.getInt(1);
            }
            vo.setCodigoMedico(id);

        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarResultSet(rs);
            this.cerrarStatement(stmt);
            this.cerrarConexion(con);
        }
        return vo;
    }

    public Medico obtener(int codigoMedico) throws DAOExcepcion {
        Medico vo = new Medico();
        Connection con = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            String query = "select codigoMedico, Especialidad_codigoEspecialidad, dni, nombres, apellidos, numColegiatura, sexo, fechaNac, direccion, telefono, mail from medico where codigoMedico=?";
            con = dataSource.getConnection();
            stmt = con.prepareStatement(query);
            stmt.setInt(1, codigoMedico);
            rs = stmt.executeQuery();
            if (rs.next()) {
                vo.setCodigoMedico(rs.getInt("codigoMedico"));
                vo.setEspecialidadcodigoEspecialidad(rs.getInt("Especialidad_codigoEspecialidad"));
                vo.setDni(rs.getString("dni"));
                vo.setNombres(rs.getString("nombres"));
                vo.setApellidos(rs.getString("apellidos"));
                vo.setNumColegiatura(rs.getInt("numColegiatura"));
                vo.setSexo(rs.getString("sexo"));
                vo.setFechaNac(rs.getString("fechaNac"));
                vo.setDireccion(rs.getString("direccion"));
                vo.setTelefono(rs.getString("telefono"));
                vo.setMail(rs.getString("mail"));
            }
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarResultSet(rs);
            this.cerrarStatement(stmt);
            this.cerrarConexion(con);
        }
        return vo;
    }

    public void eliminar(int codigoMedico) throws DAOExcepcion {
        String query = "DELETE FROM medico WHERE codigoMedico=?";
        Connection con = null;
        PreparedStatement stmt = null;
        try {
            con = dataSource.getConnection();
            stmt = con.prepareStatement(query);
            stmt.setInt(1, codigoMedico);
            int i = stmt.executeUpdate();
            if (i != 1) {
                throw new SQLException("No se pudo eliminar");
            }
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarStatement(stmt);
            this.cerrarConexion(con);
        }
    }

    public Medico actualizar(Medico vo) throws DAOExcepcion {
        String query = "update medico set Especialidad_codigoEspecialidad=?,dni=?,nombres=?,apellidos=?,numColegiatura=?,sexo=?,fechaNac=?,direccion=?,telefono=?,mail=? where codigoMedico=?";
        Connection con = null;
        PreparedStatement stmt = null;
        try {
            con = dataSource.getConnection();
            stmt = con.prepareStatement(query);
            stmt.setInt(1, vo.getEspecialidadcodigoEspecialidad());
            stmt.setString(2, vo.getDni());
            stmt.setString(3, vo.getNombres());
            stmt.setString(4, vo.getApellidos());
            stmt.setInt(5, vo.getNumColegiatura());
            stmt.setString(6, vo.getSexo());
            stmt.setString(7, vo.getFechaNac());
            stmt.setString(8, vo.getDireccion());
            stmt.setString(9, vo.getTelefono());
            stmt.setString(10, vo.getMail());
            stmt.setInt(11, vo.getCodigoMedico());
            int i = stmt.executeUpdate();
            if (i != 1) {
                throw new SQLException("No se pudo actualizar");
            }
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarStatement(stmt);
            this.cerrarConexion(con);
        }
        return vo;
    }

    public Collection<Medico> listar() throws DAOExcepcion {
        Collection<Medico> c = new ArrayList<Medico>();
        Connection con = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            con = dataSource.getConnection();
            String query = "SELECT codigoMedico, Especialidad_codigoEspecialidad, dni, nombres, apellidos, numColegiatura, sexo, fechaNac, direccion, telefono, mail from medico";
            stmt = con.prepareStatement(query);
            rs = stmt.executeQuery();
            while (rs.next()) {
                Medico vo = new Medico();

                vo.setCodigoMedico(rs.getInt("codigoMedico"));
                vo.setEspecialidadcodigoEspecialidad(rs.getInt("Especialidad_codigoEspecialidad"));
                vo.setDni(rs.getString("dni"));
                vo.setNombres(rs.getString("nombres"));
                vo.setApellidos(rs.getString("apellidos"));
                vo.setNumColegiatura(rs.getInt("numColegiatura"));
                vo.setSexo(rs.getString("sexo"));
                vo.setFechaNac(rs.getString("fechaNac"));
                vo.setDireccion(rs.getString("direccion"));
                vo.setTelefono(rs.getString("telefono"));
                vo.setMail(rs.getString("mail"));

                c.add(vo);
            }

        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarResultSet(rs);
            this.cerrarStatement(stmt);
            this.cerrarConexion(con);
        }
        return c;
    }
}
